﻿using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.IO;
using Tibet.Entidades;

namespace Tibet.Logica
{
    class LogicaReglaNombrarClases : Regla
    {   
        //Atributos

        private int _tipo;
         
        //Propiedades

        public int Tipo
        {
            get { return _tipo; }
            set { _tipo = value; }
        }
       
        //Metodos
        public LogicaReglaNombrarClases(int tipo)
        {
            //Constructor
            Tipo = tipo; 
        }

        override public Resultado Aplicar(ArrayList archivo)
        {
            try
            {
                if (Tipo == 1)
                    return regla_Mayuscula_NoUnderscore(archivo);
                if (Tipo == 2)
                    return regla_Mayuscula_SiUnderscore(archivo);
                if (Tipo == 3)
                    return regla_ninuscula_NoUnderscore(archivo);
                if (Tipo == 4)
                    return regla_ninuscula_SIUnderscore(archivo);
                return null;              
            }
            catch (Exception e)
            {
                return null;
            }
        }

        private Resultado regla_Mayuscula_NoUnderscore(ArrayList archivo)
        /*Valida el nombre de la clase empiece con mayuscula.
          Ejemplo: Nombrejemeplo             
         */
        {
            //Variables iniciales
            int AnchoLinea; //Guardara el tamaño de cada linea del archivo.
            int i = 0;      //Contador de iteraciones para los ciclos (for).
            int LineaActual = 0; //Linea actual que se esta leyendo.
            Resultado Resp = new Resultado(); //Objeto resultado que sera retornado.

            //Inicializamos Resp asumiendo que el archivo cumple con la regla.
            Resp.Fecha = new DateTime();
            Resp.Fecha = DateTime.Now;
            Resp.Respuesta = true;
            Resp.Mensaje = "No se encontraron errores";
            Resp.Linea = 0;

            try
            {
                foreach (string linea in archivo) //Recorro la lista linea por linea
                {
                    LineaActual++;                //Aumenta el contador de la linea.
                    if (linea.Length != 0)        //Si la linea no esta vacia.
                    {
                        AnchoLinea = linea.Length;//Guardamos la cantidad de espacios de la linea.
                        i = 0;                    //Reiniciamos el contador.
                        while (i < AnchoLinea)    //Recorremos la linea caracter por caracter.
                        {
                            if (linea[i] == 'c') // Si encontramos un abrir de clase.
                            {
                                if (linea[i + 1] == 'l')
                                {
                                    if (linea[i + 2] == 'a')
                                    {
                                        if (linea[i + 3] == 's')
                                        {
                                            if (linea[i + 4] == 's')
                                            {
                                                if (linea[i + 5] == ' ')
                                                {
                                                    int j = 6;
                                                    int cont;
                                                    string original = linea[j].ToString();
                                                    string aComparar = original.ToUpper();
                                                    bool x = original.Equals(aComparar);

                                                    if (x == true) //chequea que inicie en Mayuscula
                                                    {
                                                        for (cont = j + 1; cont <= AnchoLinea-1; cont++)    //revisa toda la linea del nombre de la clase
                                                        {                                               //si ademas de iniciar en mayuscula tiene underscore
                                                            if (linea[cont] == '_')                     //emite un error de underscore y exito de mayuscula
                                                            {
                                                                Resp.Linea = LineaActual;
                                                                Resp.Respuesta = false;
                                                                Resp.Mensaje = "No existe un buen nombramiento de clase en el archivo en la linea " + LineaActual +
                                                                    ", aunque el nombre inicia en mayuscula, tiene underscore(_), ejemplo: class Nombre_p ";
                                                                return Resp;
                                                            }
                                                            cont++;
                                                        }
                                                        Resp.Linea = LineaActual;                    //si no tiene underscore emite mensaje de exito
                                                        Resp.Respuesta = true;                       //exito en mayuscula y por no tener underscore
                                                        Resp.Mensaje = "Si existe un buen nombramiento de clase en el archivo en la linea " + LineaActual +
                                                        ", el nombre inicia en Mayuscula y no tiene underscore (_), ejemplo: class Nombre";
                                                        return Resp;
                                                    }

                                                    for (cont = j + 1; cont <= AnchoLinea-1; cont++)            //Revisa si ademas de iniciar en minuscula
                                                    {                                                       //tiene underscores,si lo tiene emite doble error
                                                        if (linea[cont] == '_')                             //error de muniscula y error de underscore
                                                        {
                                                            Resp.Linea = LineaActual;
                                                            Resp.Respuesta = false;
                                                            Resp.Mensaje = "No existe un buen nombramiento de clase en el archivo en la linea " + LineaActual +
                                                                ", el nombre inicia en minusculascula, y tiene underscore(_), ejemplo: class nombre_p ";
                                                            return Resp;
                                                        }
                                                        cont++;
                                                    }
                                                    Resp.Linea = LineaActual;                               //si ademas de iniciar en minuscula, no tiene underscore
                                                    Resp.Respuesta = true;                                  //emite solo error de minuscula y exito de no underscore
                                                    Resp.Mensaje = "No existe un buen nombramiento de clase en el archivo en la linea " + LineaActual +
                                                    ", aunque no tenga underscore (_), el nombre inicia en minuscula, ejemplo: class nombre";
                                                    return Resp;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            i++;
                        }

                    }

                }
                return Resp; //Retornamos respuesta.
            }
            catch (Exception e)
            {
                Resp.Linea = LineaActual;
                Resp.Respuesta = false;
                Resp.Mensaje = "Ocurrio un error inesperado al leer la linea " + LineaActual + ". Error " + e.Message;
                return Resp;
            }
        }

        private Resultado regla_Mayuscula_SiUnderscore(ArrayList archivo)
        {
            //Variables iniciales
            int AnchoLinea; //Guardara el tamaño de cada linea del archivo.
            int i = 0;      //Contador de iteraciones para los ciclos (for).
            int LineaActual = 0; //Linea actual que se esta leyendo.
            Resultado Resp = new Resultado(); //Objeto resultado que sera retornado.

            //Inicializamos Resp asumiendo que el archivo cumple con la regla.
            Resp.Fecha = new DateTime();
            Resp.Fecha = DateTime.Now;
            Resp.Respuesta = true;
            Resp.Mensaje = "No se encontraron errores";
            Resp.Linea = 0;

            try
            {
                foreach (string linea in archivo) //Recorro la lista linea por linea
                {
                    LineaActual++;                //Aumenta el contador de la linea.
                    if (linea.Length != 0)        //Si la linea no esta vacia.
                    {
                        AnchoLinea = linea.Length;//Guardamos la cantidad de espacios de la linea.
                        i = 0;                    //Reiniciamos el contador.
                        while (i < AnchoLinea)    //Recorremos la linea caracter por caracter.
                        {
                            if (linea[i] == 'c') // Si encontramos un abrir de clase.
                            {
                                if (linea[i + 1] == 'l')
                                {
                                    if (linea[i + 2] == 'a')
                                    {
                                        if (linea[i + 3] == 's')
                                        {
                                            if (linea[i + 4] == 's')
                                            {
                                                if (linea[i + 5] == ' ')
                                                {
                                                    int j = 6;
                                                    int cont;
                                                    string original = linea[j].ToString();
                                                    string aComparar = original.ToUpper();
                                                    bool x = original.Equals(aComparar);

                                                    if (x == true) //chequea que inicie en Mayuscula
                                                    {
                                                        for (cont = j + 1; cont <= AnchoLinea-1; cont++)    //revisa toda la linea del nombre de la clase
                                                        {                                               //si ademas de iniciar en mayuscula tiene underscore
                                                            if (linea[cont] == '_')                     //emite un exito de underscore y exito de mayuscula
                                                            {
                                                                Resp.Linea = LineaActual;
                                                                Resp.Respuesta = false;
                                                                Resp.Mensaje = "Si existe un buen nombramiento de clase en el archivo en la linea " + LineaActual +
                                                                    ", el nombre inicia en mayuscula, y tiene underscore(_), ejemplo: class Nombre_p ";
                                                                return Resp;
                                                            }
                                                            cont++;
                                                        }
                                                        Resp.Linea = LineaActual;                    //si no tiene underscore emite mensaje de error
                                                        Resp.Respuesta = true;                       //exito en mayuscula y error por no tener underscore
                                                        Resp.Mensaje = "No existe un buen nombramiento de clase en el archivo en la linea " + LineaActual +
                                                        ", aunque el nombre inicia en Mayuscula y no tiene underscore (_), ejemplo: class Nombre";
                                                        return Resp;
                                                    }

                                                    for (cont = j + 1; cont <= AnchoLinea-1; cont++)            //Revisa si ademas de iniciar en minuscula
                                                    {                                                       //tiene underscores,emite mensaje de exito de underscore
                                                        if (linea[cont] == '_')                             //y mensaje de error de muniscula
                                                        {
                                                            Resp.Linea = LineaActual;
                                                            Resp.Respuesta = false;
                                                            Resp.Mensaje = "No existe un buen nombramiento de clase en el archivo en la linea " + LineaActual +
                                                                ", aunque tiene underscore(_), el nombre inicia en minusculascula, ejemplo: class nombre_p ";
                                                            return Resp;
                                                        }
                                                        cont++;
                                                    }
                                                    Resp.Linea = LineaActual;                               //si ademas de iniciar en minuscula, no tiene underscore
                                                    Resp.Respuesta = true;                                  //emite error de minuscula y error de no underscore
                                                    Resp.Mensaje = "No existe un buen nombramiento de clase en el archivo en la linea " + LineaActual +
                                                    ", el nombre inicia en minuscula,y aunque no tenga underscore (_),  ejemplo: class nombre";
                                                    return Resp;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            i++;
                        }

                    }

                }
                return Resp; //Retornamos respuesta.
            }
            catch (Exception e)
            {
                Resp.Linea = LineaActual;
                Resp.Respuesta = false;
                Resp.Mensaje = "Ocurrio un error inesperado al leer la linea " + LineaActual + ". Error " + e.Message;
                return Resp;
            }
        }

        private Resultado regla_ninuscula_NoUnderscore(ArrayList archivo)
        {
            //Variables iniciales
            int AnchoLinea; //Guardara el tamaño de cada linea del archivo.
            int i = 0;      //Contador de iteraciones para los ciclos (for).
            int LineaActual = 0; //Linea actual que se esta leyendo.
            Resultado Resp = new Resultado(); //Objeto resultado que sera retornado.

            //Inicializamos Resp asumiendo que el archivo cumple con la regla.
            Resp.Fecha = new DateTime();
            Resp.Fecha = DateTime.Now;
            Resp.Respuesta = true;
            Resp.Mensaje = "No se encontraron errores";
            Resp.Linea = 0;

            try
            {
                foreach (string linea in archivo) //Recorro la lista linea por linea
                {
                    LineaActual++;                //Aumenta el contador de la linea.
                    if (linea.Length != 0)        //Si la linea no esta vacia.
                    {
                        AnchoLinea = linea.Length;//Guardamos la cantidad de espacios de la linea.
                        i = 0;                    //Reiniciamos el contador.
                        while (i < AnchoLinea)    //Recorremos la linea caracter por caracter.
                        {
                            if (linea[i] == 'c') // Si encontramos un abrir de clase.
                            {
                                if (linea[i + 1] == 'l')
                                {
                                    if (linea[i + 2] == 'a')
                                    {
                                        if (linea[i + 3] == 's')
                                        {
                                            if (linea[i + 4] == 's')
                                            {
                                                if (linea[i + 5] == ' ')
                                                {
                                                    int j = 6;
                                                    int cont;
                                                    string original = linea[j].ToString();
                                                    string aComparar = original.ToUpper();
                                                    bool x = original.Equals(aComparar);

                                                    if (x == true) //chequea que inicie en Mayuscula
                                                    {
                                                        for (cont = j + 1; cont <= AnchoLinea-1; cont++)    //revisa toda la linea del nombre de la clase
                                                        {                                               //si ademas de iniciar en mayuscula tiene underscore
                                                            if (linea[cont] == '_')                     //emite un error de underscore y error de mayuscula
                                                            {
                                                                Resp.Linea = LineaActual;
                                                                Resp.Respuesta = false;
                                                                Resp.Mensaje = "No existe un buen nombramiento de clase en el archivo en la linea " + LineaActual +
                                                                    ", el nombre inicia en mayuscula, y tiene underscore(_), ejemplo: class Nombre_p ";
                                                                return Resp;
                                                            }
                                                            cont++;
                                                        }
                                                        Resp.Linea = LineaActual;
                                                        Resp.Respuesta = true;                       //error en mayuscula y exito por no tener underscore
                                                        Resp.Mensaje = "No existe un buen nombramiento de clase en el archivo en la linea " + LineaActual +
                                                        ", aunque el nombre no tiene underscore (_) inicia en Mayuscula, ejemplo: class Nombre";
                                                        return Resp;
                                                    }

                                                    for (cont = j + 1; cont <= AnchoLinea-1; cont++)            //Revisa si ademas de iniciar en minuscula
                                                    {                                                       //tiene underscores,emite mensaje de error de underscore
                                                        if (linea[cont] == '_')                             //y mensaje de exito de muniscula
                                                        {
                                                            Resp.Linea = LineaActual;
                                                            Resp.Respuesta = false;
                                                            Resp.Mensaje = "No existe un buen nombramiento de clase en el archivo en la linea " + LineaActual +
                                                                ", aunque el nombre inicia en minusculascula tiene underscore(_), ejemplo: class nombre_p ";
                                                            return Resp;
                                                        }
                                                        cont++;
                                                    }
                                                    Resp.Linea = LineaActual;                               //si ademas de iniciar en minuscula, no tiene underscore
                                                    Resp.Respuesta = true;                                  //emite exito de minuscula y exito de no underscore
                                                    Resp.Mensaje = "Si existe un buen nombramiento de clase en el archivo en la linea " + LineaActual +
                                                    ", el nombre inicia en minuscula y no tiene underscore (_),  ejemplo: class nombre";
                                                    return Resp;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            i++;
                        }

                    }

                }
                return Resp; //Retornamos respuesta.
            }
            catch (Exception e)
            {
                Resp.Linea = LineaActual;
                Resp.Respuesta = false;
                Resp.Mensaje = "Ocurrio un error inesperado al leer la linea " + LineaActual + ". Error " + e.Message;
                return Resp;
            }
        }

        private Resultado regla_ninuscula_SIUnderscore(ArrayList archivo)
        {
            {
                //Variables iniciales
                int AnchoLinea; //Guardara el tamaño de cada linea del archivo.
                int i = 0;      //Contador de iteraciones para los ciclos (for).
                int LineaActual = 0; //Linea actual que se esta leyendo.
                Resultado Resp = new Resultado(); //Objeto resultado que sera retornado.

                //Inicializamos Resp asumiendo que el archivo cumple con la regla.
                Resp.Fecha = new DateTime();
                Resp.Fecha = DateTime.Now;
                Resp.Respuesta = true;
                Resp.Mensaje = "No se encontraron errores";
                Resp.Linea = 0;

                try
                {
                    foreach (string linea in archivo) //Recorro la lista linea por linea
                    {
                        LineaActual++;                //Aumenta el contador de la linea.
                        if (linea.Length != 0)        //Si la linea no esta vacia.
                        {
                            AnchoLinea = linea.Length;//Guardamos la cantidad de espacios de la linea.
                            i = 0;                    //Reiniciamos el contador.
                            while (i < AnchoLinea)    //Recorremos la linea caracter por caracter.
                            {
                                if (linea[i] == 'c') // Si encontramos un abrir de clase.
                                {
                                    if (linea[i + 1] == 'l')
                                    {
                                        if (linea[i + 2] == 'a')
                                        {
                                            if (linea[i + 3] == 's')
                                            {
                                                if (linea[i + 4] == 's')
                                                {
                                                    if (linea[i + 5] == ' ')
                                                    {
                                                        int j = 6;
                                                        int cont;
                                                        string original = linea[j].ToString();
                                                        string aComparar = original.ToUpper();
                                                        bool x = original.Equals(aComparar);

                                                        if (x == true) //chequea que inicie en Mayuscula
                                                        {
                                                            for (cont = j + 1; cont <= AnchoLinea-1; cont++)    //revisa toda la linea del nombre de la clase
                                                            {                                               //si ademas de iniciar en mayuscula tiene underscore
                                                                if (linea[cont] == '_')                     //emite un exito de underscore y error de mayuscula
                                                                {
                                                                    Resp.Linea = LineaActual;
                                                                    Resp.Respuesta = false;
                                                                    Resp.Mensaje = "No existe un buen nombramiento de clase en el archivo en la linea " + LineaActual +
                                                                        ", aunque tiene underscore(_) inicia en mayuscula, ejemplo: class Nombre_p ";
                                                                    return Resp;
                                                                }
                                                                cont++;
                                                            }

                                                            Resp.Linea = LineaActual;
                                                            Resp.Respuesta = true;                       //error en mayuscula y error por no tener underscore
                                                            Resp.Mensaje = "No existe un buen nombramiento de clase en el archivo en la linea " + LineaActual +
                                                            ", el nombre no tiene underscore (_) e inicia en Mayuscula, ejemplo: class Nombre";
                                                            return Resp;
                                                        }

                                                        for (cont = j + 1; cont <= AnchoLinea-1; cont++)            //Revisa si ademas de iniciar en minuscula
                                                        {                                                       //tiene underscores,emite mensaje de exito de underscore
                                                            if (linea[cont] == '_')                             //y mensaje de exito de muniscula
                                                            {
                                                                Resp.Linea = LineaActual;
                                                                Resp.Respuesta = false;
                                                                Resp.Mensaje = "Si existe un buen nombramiento de clase en el archivo en la linea " + LineaActual +
                                                                    ", el nombre inicia en minusculascula y tiene underscore(_), ejemplo: class nombre_p ";
                                                                return Resp;
                                                            }
                                                            cont++;
                                                        }
                                                        Resp.Linea = LineaActual;                               //si ademas de iniciar en minuscula, no tiene underscore
                                                        Resp.Respuesta = true;                                  //emite exito de minuscula y error de no underscore
                                                        Resp.Mensaje = "No existe un buen nombramiento de clase en el archivo en la linea " + LineaActual +
                                                        ", aunque el nombre inicia en minuscula no tiene underscore (_),  ejemplo: class nombre";
                                                        return Resp;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                i++;
                            }

                        }

                    }
                    return Resp; //Retornamos respuesta.
                }
                catch (Exception e)
                {
                    Resp.Linea = LineaActual;
                    Resp.Respuesta = false;
                    Resp.Mensaje = "Ocurrio un error inesperado al leer la linea " + LineaActual + ". Error " + e.Message;
                    return Resp;
                }
            }
        }
    }
}
